package com.c2b.algorithm.leetcode.base;

import java.util.Arrays;

/**
 * <a href='https://leetcode.cn/problems/odd-string-difference/'>差值数组不同的字符串(Odd String Difference)</a>
 * <p>给你一个字符串数组 words ，每一个字符串长度都相同，令所有字符串的长度都为 n 。</p>
 * <p>
 * 每个字符串 words[i] 可以被转化为一个长度为 n - 1 的 差值整数数组 difference[i] ，其中对于 0 <= j <= n - 2 有 difference[i][j] = words[i][j+1] - words[i][j] 。注意两个字母的差值定义为它们在字母表中 位置 之差，也就是说 'a' 的位置是 0 ，'b' 的位置是 1 ，'z' 的位置是 25 。
 *     <ul>
 *         <li>比方说，字符串 "acb" 的差值整数数组是 [2 - 0, 1 - 2] = [2, -1] 。</li>
 *     </ul>
 *     words 中所有字符串 除了一个字符串以外 ，其他字符串的差值整数数组都相同。你需要找到那个不同的字符串。
 * </p>
 * <p>请你返回 words中 差值整数数组 不同的字符串。</p>
 *
 * <p>
 * <b>示例</b>
 * <pre>
 * 示例 1：
 *      输入：words = ["adc","wzy","abc"]
 *      输出："abc"
 *      解释：
 *          - "adc" 的差值整数数组是 [3 - 0, 2 - 3] = [3, -1] 。
 *          - "wzy" 的差值整数数组是 [25 - 22, 24 - 25]= [3, -1] 。
 *          - "abc" 的差值整数数组是 [1 - 0, 2 - 1] = [1, 1] 。
 *          不同的数组是 [1, 1]，所以返回对应的字符串，"abc"。
 *
 * 示例 2：
 *      输入：words = ["aaa","bob","ccc","ddd"]
 *      输出："bob"
 *      解释：除了 "bob" 的差值整数数组是 [13, -13] 以外，其他字符串的差值整数数组都是 [0, 0] 。
 * </pre>
 * </p>
 *
 * <p>
 * <b>提示：</b>
 *  <ul>
 *      <li>3 <= words.length <= 100</li>
 *      <li>n == words[i].length</li>
 *      <li>2 <= n <= 20</li>
 *      <li>words[i] 只含有小写英文字母。</li>
 *  </ul>
 * </p>
 *
 * @author c2b
 * @since 2024/1/23 16:29
 */
public class LC2451OddStringDifference_S {

    static class Solution {
        public String oddString(String[] words) {
            int[] diff0 = get(words[0]);
            int[] diff1 = get(words[1]);
            // 如果第一个 和 第二个字符串的差值数组相同；那么后续出现的第一个差值数组不相等的字符串即为结果
            if (Arrays.equals(diff0, diff1)) {
                for (int i = 2; i < words.length; i++) {
                    if (!Arrays.equals(diff0, get(words[i]))) {
                        return words[i];
                    }
                }
            }
            // 如果第一个 和 第二个字符串的差值数组不相同；通过第三个字符串的差值数组进行判断：
            //      如果和第一个字符串的差值数组相同，则返回第二个字符串
            //      如果和第二个字符串的差值数组相同，则返回第一个字符串
            return Arrays.equals(diff0, get(words[2])) ? words[1] : words[0];
        }

        private int[] get(String word) {
            int[] diff = new int[word.length() - 1];
            char[] chars = word.toCharArray();
            for (int i = 1; i < chars.length; i++) {
                diff[i - 1] = chars[i] - chars[i - 1];
            }
            return diff;
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        System.out.println(solution.oddString(new String[]{"adc", "wzy", "abc"}));
        System.out.println(solution.oddString(new String[]{"aaa", "bob", "ccc", "ddd"}));
    }
}
